#include "ui_update.h"
#include "mainwindow.h"

UiUpdate::UiUpdate(Window* parent)
{
    mainwindow = parent;
    ui_parameter_init();
}

UiUpdate::~UiUpdate()
{
    delete[] module_parameters;
}

/**
 * @brief 初始化用户界面参数
 *        本函数遍历主窗口下的所有控件，根据控件的objectName进行筛选，
 *        排除空objectName和内部控件，对剩余控件进行数量统计和参数计算。
 *        这是为了确保每个需要关注的控件都能在界面上正确显示和工作。
 */
void UiUpdate::ui_parameter_init()
{
    QSize WindowSize = mainwindow->size();
    QList<QWidget*> allWidgets = mainwindow->findChildren<QWidget*>();
    module_number = 0; // 初始模块数量为0
    for (QWidget* widget : allWidgets)
    {
        QString widgetName = widget->objectName();
        if (UI_NAME_FILTER) // 只处理非空的 objectName 并排除内部控件
        {
            module_number++;
        }
    }
    module_parameters = new Module_Parameters[module_number];//根据遍历得到的数量申请内存
    int i = 0;
    for (QWidget* widget : allWidgets)
    {
        QString widgetName = widget->objectName();
        if (UI_NAME_FILTER) // 只处理非空的 objectName 并排除内部控件
        {
            ui_parameter_cal(WindowSize, widget, module_parameters[i++]);
        }
    }
}

/**
 * @brief 计算ui控件参数 初始化调用
 * @param window_size 初始化的窗口大小
 * @param widget 控件
 * @param para 控件参数
 */
void UiUpdate::ui_parameter_cal(QSize window_size, QWidget *widget, Module_Parameters& para)
{
    QSize Module_size = widget->size();
    QPoint position = widget->pos();
    para.size_w_rate = (float)Module_size.width() / (float)window_size.width();
    para.size_h_rate = (float)Module_size.height() / (float)window_size.height();
    para.pos_x_rate = (float)position.x() / (float)window_size.width();
    para.pos_y_rate = (float)position.y() / (float)window_size.height();
}

/**
 * @brief ui控件更新控件布局 保持比例
 * @param newWindowSize 新窗口大小
 * @param widget 控件
 * @param para 控件参数
 */
void UiUpdate::ui_updata_layout(QSize newWindowSize, QWidget *widget, const Module_Parameters para)
{
    widget->resize(newWindowSize.width() * para.size_w_rate, newWindowSize.height() * para.size_h_rate);
    widget->move(newWindowSize.width() * para.pos_x_rate, newWindowSize.height() * para.pos_y_rate);
}

/**
 * @brief 窗口改变事件槽
 * @param event 
 */
void UiUpdate::ui_window_resize(QResizeEvent *event)
{
#if UPDATE_UI == true
    static QSize oldSize = event->size();// 获取初始窗口的新大小 程序运行会触发一次这个槽
    QSize newSize = event->size();     // 获取窗口当前的新大小
    if(qAbs(oldSize.width() - newSize.width()) < WINDOW_SIZE_OFFSET && qAbs(oldSize.height() - newSize.height()) < WINDOW_SIZE_OFFSET)
    {
        // QMainWindow::resizeEvent(event);  // 调用基类的 resizeEvent 以保证默认行为
        return;
    }
    oldSize = newSize;//迭代本次窗口大小

    QList<QWidget*> allWidgets = mainwindow->findChildren<QWidget*>();
    int i = 0;
    for (QWidget* widget : allWidgets) //更新所有控件位置
    {
        QString widgetName = widget->objectName();
        if (UI_NAME_FILTER)
        {
            ui_updata_layout(newSize, widget, module_parameters[i++]);
#if UI_UPDATA_DEBUG == true
            qDebug() << "Widget: " << widgetName;
#endif /* UI_UPDATA_DEBUG */
        }
    }
#if UI_UPDATA_DEBUG == true
    qDebug() << "end" << module_number;
#endif /* UI_UPDATA_DEBUG */
#endif /* UPDATE_UI */
    // QMainWindow::resizeEvent(event);  // 调用基类的 resizeEvent 以保证默认行为
} 
